/**
 * XUser                用户数据类
 * 用户相关的数据：用户ID、用户名、真实姓名、电话、密码、登录状态、所在公司、部门等信息
 * @author              罗伟权
 * @createdate          2013-06-17
 * @version             1.0
 */

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

// 性别
extern NSInteger const SEX_UNKNOW;
extern NSInteger const SEX_MALE;
extern NSInteger const SEX_FEMALE;

extern NSString *const KEY_LOC_LAT;
extern NSString *const KEY_LOC_LON;

@interface XUser : NSObject


#pragma mark 用户信息
/**
 * 获取当前用户ID
 * @result                           NSInteger 类型，用户ID，若没有设置的话，返回0
 */
+ (NSString *)userID;


/**
 * 保存当前用户ID
 * @param   userID                   NSInteger 类型，用户ID
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setUserID:(NSString *)userID;


/**
 * 获取当前用户密码
 * @result                           用户密码，若没有设置的话，返回0
 */
+ (NSString *)userPwd;


/**
 * 保存当前用户密码
 * @param   userPwd                  用户密码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setUserPwd:(NSString *)userPwd;


/**
 * 获取当前用户名
 * @result                           NSString 类型，用户名
 */
+ (NSString*)userName;


/**
 * 保存当前用户名
 * @param    userName                NSString 类型，用户名
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setUserName:(NSString*)userName;


/**
 * 获取当前用户名
 * @result                           NSString 类型，用户名
 */
+ (NSString*)authority;


/**
 * 保存当前用户名
 * @param    userName                NSString 类型，用户名
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setAuthority:(NSString*)authority;


/**
 * 获取当前用户真实姓名
 * @result                           NSString 类型，用户真实姓名
 */
+ (NSString*)userRealName;


/**
 * 保存用户的真实姓名
 * @param    realName                NSString 类型，用户真实姓名
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setUserRealName:(NSString*)realName;


/**
 * 性别
 * @result                           返回用户性别：SEX_MALE 男性，SEX_FEMALE 女性，SEX_UNKNOW 未知
 */
+ (NSInteger)sex;


/**
 * 性别                               
 * @param   sex                      NSInteger 类型，用户的性别，若不为 SEX_MALE、SEX_FEMALE 则全为：SEX_UNKNOW
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setSex:(NSInteger)sex;


/**
 * 获取当前用户手机号码
 * @result                           NSString 类型，用户手机号码
 */
+ (NSString*)phoneNum;


/**
 * 保存用户的手机号码
 * @param    phoneNum                NSString 类型，用户手机号码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setPhoneNum:(NSString*)phoneNum;


/**
 * 获取当前用户邮箱
 * @result                           NSString 类型，用户手机号码
 */
+ (NSString*)email;


/**
 * 保存用户的用户邮箱
 * @param    email                   NSString 类型，用户手机号码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setEmail:(NSString*)email;


/**
 * 积分
 * @result                           返回用户积分
 */
+ (NSInteger)integral;


/**
 * 设置积分
 * @param   integral                 NSInteger 类型，用户的积分
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setIntegral:(NSInteger)integral;


/**
 * 获取用户登录次数
 * @result                           返回用户登录次数
 */
+ (NSInteger)loginNum;


/**
 * 设置用户登录次数
 * @param   loginNum                 NSInteger 类型，用户的登录次数
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setLoginNum:(NSInteger)loginNum;


/**
 * 获取当前用户注册时间
 * @result                           NSString 类型，用户注册时间
 */
+ (NSString*)lastLoginTime;


/**
 * 保存用户的用户注册时间
 * @param    lastLoginTime           NSString 类型，用户注册时间
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setLastLoginTime:(NSString*)lastLogin;


/**
 * 获取当前用户注册时间
 * @result                           NSString 类型，用户注册时间
 */
+ (NSString*)registerTime;


/**
 * 保存用户的用户注册时间
 * @param    registerTime            NSString 类型，用户注册时间
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setRegisterTime:(NSString*)registerTime;


/**
 * 获取当前城市ID
 * @result                           NSString 类型，城市ID
 */
+ (NSString*)cityID;


/**
 * 保存当前城市ID
 * @param    cityID                  NSString 类型，城市ID
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setCityID:(NSString*)cityID;


/**
 * 获取当前城市编码
 * @result                           NSString 类型，城市编码
 */
+ (NSString*)cityCode;


/**
 * 保存当前城市编码
 * @param    cityCode                NSString 类型，城市编码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setCityCode:(NSString*)cityCode;


/**
 * 保存当前城市百度编码
 * @param    cityCode                NSString 类型，城市百度编码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setBaiduCode:(NSString*)baiduCode;


/**
 * 获取当前城市百度编码
 * @result                           NSString 类型，城市百度编码
 */
+ (NSString*)baiduCode;


/**
 * 获取当前城市名称
 * @result                           NSString 类型，城市名称
 */
+ (NSString*)cityName;


/**
 * 保存当前城市名称
 * @param    cityName                NSString 类型，城市名称
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setCityName:(NSString*)cityName;


/**
 * 获取当前城市名称拼音首字母
 * @result                           NSString 类型，城市名称拼音首字母
 */
+ (NSString*)cityNamePinCap;


/**
 * 保存当前城市名称拼音首字母
 * @param    cityNamePinCap          NSString 类型，城市名称拼音首字母
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setCityNamePinCap:(NSString*)cityNamePinCap;


/**
 * 获取当前城市坐标信息
 * @result                           CLLocationCoordinate2D 类型，城市坐标信息
 */
+ (CLLocationCoordinate2D)cityGEO;


/**
 * 保存当前城市坐标信息
 * @param   longitude                double 类型，城市坐标经度（x）
 * @param   latitude                 double 类型，城市坐标纬度（y）
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setCityGEOWithLongitude:(double)longitude andLatitude:(double)latitude;


/**
 * 获取当前城市所属省份简称
 * @result                           NSString 类型，城市所属省份简称
 */
+ (NSString*)provShortName;


/**
 * 保存当前城市所属省份简称
 * @param    provShortName           NSString 类型，城市所属省份简称
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setProvShortName:(NSString*)provShortName;


/**
 * 保存当前城市相关信息
 * @param    cityID                  NSString 类型，城市ID
 * @param    cityCode                NSString 类型，城市编码
 * @param    baiduCode               NSString 类型，城市百度编码
 * @param    cityName                NSString 类型，城市名称
 * @param    cityNamePinCap          NSString 类型，城市名称拼音首字母
 * @param    provShortName           NSString 类型，城市所属省份简称
 * @param    longitude               double 类型，城市坐标经度（x）
 * @param    latitude                double 类型，城市坐标纬度（y）
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)saveCityInfoWithID:(NSString *)cityID
                      code:(NSString *)cityCode
                 baiduCode:(NSString*)baiduCode
                      name:(NSString *)cityName
                    pinCap:(NSString *)pinCap
             provShortName:(NSString *)provShort
                 longitude:(double)longitude
                  latitude:(double)latitude;


/**
 *  保存当前定位到的位置所在的城市名
 */
+ (BOOL)setLocCity:(NSString*)city;


/**
 *  获取定位到的位置所在的城市名
 */
+(NSString*)locCity;


/**
 * 获取当前用户的登录帐号
 * @result                           NSString 类型，当前用户的登录帐号
 */
+ (NSString*)account;


/**
 * 保存当前用户的登录帐号
 * @param    account                 NSString 类型，当前用户的登录帐号
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setAccount:(NSString*)account;


/**
 * 获取当前用户的登录密码
 * @result                           NSString 类型，当前用户的登录密码
 */
+ (NSString*)password;


/**
 * 保存当前用户的登录密码
 * @param    password                NSString 类型，当前用户的登录密码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setPassword:(NSString*)password;


/**
 * 获取是否保存登录密码
 * @result                           BOOL 类型，是否保存登录密码
 */
+ (BOOL)savePassword;


/**
 * 保存是否保存登录密码
 * @param    savePwd                 BOOL 类型，是否保存登录密码
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setSavePassword:(BOOL)savePwd;


/**
 * 获取是否自动登录
 * @result                           BOOL 类型，是否自动登录
 */
+ (BOOL)autoLogin;


/**
 * 保存是否自动登录
 * @param    autoLogin               BOOL 类型，是否自动登录
 * @result                           TRUE，标识保存成功，FALSE，标识保存失败
 */
+ (BOOL)setAutoLogin:(BOOL)autoLogin;


#pragma mark 用户自定义配置存取
/**
 * 根据Key值，获取标志位状态值（BOOL型信息）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 数据类型
 */
+ (BOOL)boolForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的标志位状态值（BOOL型信息）
 * @param    flag                    BOOL 数据类型，对应的标志位值
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setBool:(BOOL)flag forKey:(NSString*)key;


/**
 * 根据Key值，获取配置值（整型信息）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 数据类型
 */
+ (NSInteger)integerForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的配置值（整型信息）
 * @param    value                   NSInteger 数据类型
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setInteger:(NSInteger)value forKey:(NSString*)key;


/**
 * 根据Key值，获取配置值（浮点信息）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 数据类型
 */
+ (float)floatForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的配置值（浮点信息）
 * @param    value                   float 数据类型
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setFloat:(float)value forKey:(NSString*)key;


/**
 * 根据Key值，获取配置值（双精度浮点信息）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 数据类型
 */
+ (double)doubleForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的配置值（双精度浮点信息）
 * @param    value                   double 数据类型
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setDouble:(double)value forKey:(NSString*)key;


/**
 * 根据Key值，获取配置值（字符串信息）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 数据类型
 */
+ (NSString*)stringForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的配置值（字符串信息）
 * @param    value                   NSString 数据类型
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setString:(NSString*)value forKey:(NSString*)key;


/**
 * 根据Key值获取指定的数据（用于用户的自定义数据）
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           id数据类型（可以为NSString，可以为NSNumber，可以为NSData等）
 */
+ (NSObject*)objectForKey:(NSString*)key;


/**
 * 根据Key值，写入相应的Object对象（用于用户的自定义数据）
 * @param    obj                     id数据类型（可以为NSString，可以为NSNumber，可以为NSData等），需要记录的对象
 * @param    key                     需要获取的数据的Key值，为NSString类型
 * @result                           BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)setObject:(NSObject*)obj forKey:(NSString*)key;


/**
 * 根据Key值，移除相应的Object对象（用于用户的自定义数据）
 * @param   key                 需要获取的数据的Key值，为NSString类型
 * @result                      BOOL 类型，YES表示设置成功，NO表示设置失败
 */
+ (BOOL)removeObjectForKey:(NSString*)key;


@end


